package week1.opg2;

/** 
 * Testprogramma voor Kamer en Gast
 * Practicumopgave Programmeren 1
 * @author Arend Rensink
 * @version $Revision: 1.13 $
 */
public class GastTest {
    /** Testvariabele voor een <tt>Gast</tt>-object. */
    public Gast ot;
    /** Testvariabele voor een <tt>Gast</tt>-object. */
    public Gast sien;
    /** Testvariabele voor een <tt>Kamer</tt>-object. */
    public Kamer k101;
    /** Testvariabele voor een <tt>Kamer</tt>-object. */
    public Kamer k102;

    /** Roept alle tests van deze klasse een voor een aan. */
    public void start() {
        System.out.println("Testklasse: "+this.getClass());
        setUp();
        testBegintoestand();
        setUp();
        testCheckinLeeg();
        setUp();
        testCheckinBezet();
        setUp();
        testCheckuitBekend();
        setUp();
        testCheckuitOnbekend();
    }

    /**
     * Zet de instantievariabelen op een welgedefinieerde beginwaarde.
     * Alle testmethoden beginnen met een aanroep van deze.
     * <p>
     * Wijst aan de instantievariabele <tt>ot</tt> een <tt>Gast</tt>-object 
     * toe met naam <tt>&quot;Ot&quot;</tt>, en aan de instantievariabele
     * <tt>sien</tt> een <tt>Gast</tt>-object toe met naam <tt>&quot;Sien&quot;</tt>.
     * Wijst tevens aan de instantievariabele <tt>k101</tt> een <tt>Kamer</tt>-object 
     * toe met nummer <tt>101</tt>, en aan de instantievariabele
     * <tt>k102</tt> een <tt>Kamer</tt>-object toe met nummer <tt>102</tt>.
     * Checkt tenslotte <tt>sien</tt> in kamer <tt>k101</tt> in.
     */
    public void setUp() {
        // initialisatie van gast-variabelen
        ot = new Gast("Ot");
        sien = new Gast("Sien");
        // initialisatie van kamer-variabelen
        k101 = new Kamer(101);
        k102 = new Kamer(102);
        // sien is in 102 ingecheckt
        sien.checkin(k102);
    }

    /**
     * Test of de begintoestand voldoet aan de specificatie.
     * Deze methode dient vooraf gegaan te worden door een aanroep van 
     * <tt>{@link #setUp}</tt>.
     */
    public void testBegintoestand() {
        beginTest("Begintoestand");
        assertEquals("ot.getNaam()", "Ot", ot.getNaam());
        assertEquals("sien.getNaam()", "Sien", sien.getNaam());
        assertEquals("ot.getKamer()", null, ot.getKamer());
        assertEquals("sien.getKamer()", k102, sien.getKamer());
    }

    /**
     * Test het inchecken van een nieuwe gast in een nog lege kamer.
     * Roept daartoe <tt>ot.checkin(k101)</tt> aan.
     * Deze methode dient vooraf gegaan te worden door een aanroep van 
     * <tt>{@link #setUp}</tt>.
     */
    public void testCheckinLeeg() {
        beginTest("Inchecken nieuwe gast in nog lege kamer");
        assertEquals("ot.checkin(k101)", true, ot.checkin(k101));
        assertEquals("ot.getKamer()", k101, ot.getKamer());
        assertEquals("k101.getGast()", ot, k101.getGast());
    }

    /**
     * Test het inchecken van een nieuwe gast in een al verhuurde kamer.
     * Roept daartoe  <tt>ot.checkin(k102)</tt> aan.
     * Deze methode dient vooraf gegaan te worden door een aanroep van 
     * <tt>{@link #setUp}</tt>.
     */
    public void testCheckinBezet() {
        beginTest("Inchecken nieuwe gast in al verhuurde kamer");
        assertEquals("ot.checkin(k102)", false, ot.checkin(k102));
        assertEquals("ot.getKamer()", null, ot.getKamer());
        assertEquals("k102.getGast()", sien, k102.getGast());
    }

    /**
     * Test het uitchecken van een gast die een kamer gehuurd heeft.
     * Roept daartoe <tt>sien.checkuit()</tt> aan.
     * Deze methode dient vooraf gegaan te worden door een aanroep van 
     * <tt>{@link #setUp}</tt>.
     */
    public void testCheckuitBekend() {
        beginTest("Uitchecken gast die een kamer gehuurd heeft");
        assertEquals("sien.checkuit()", true, sien.checkuit());
        assertEquals("sien.getKamer()", null, sien.getKamer());
        assertEquals("k102.getGast()", null, k102.getGast());
    }

    /**
     * Test het uitchecken van een gast die geen kamer gehuurd heeft.
     * Roept daartoe <tt>ot.checkuit()</tt> aan.
     * Deze methode dient vooraf gegaan te worden door een aanroep van 
     * <tt>{@link #setUp}</tt>.
     */
    public void testCheckuitOnbekend() {
        beginTest("Uitchecken gast die geen kamer gehuurd heeft");
        assertEquals("ot.checkuit()", false, ot.checkuit());
        assertEquals("ot.getKamer()", null, ot.getKamer());
    }

    /**
     * Print de beschrijving van een testmethode.
     * @param tekst de te printen beschrijving
     */
    private void beginTest(String tekst) {
       System.out.println("    Test: "+tekst);
    }

    /**
     * Test of de werkelijke waarde van een geteste expressie 
     * overeenkomt met de verwachte (correcte) waarde.
     * Deze implementatie print beide waarden, plus een aanduiding van
     * wat er getest is, op de standaarduitvoer: het programma voert
     * geen vergelijking uit.
     */
    private void assertEquals(String tekst, Object verwacht, Object werkelijk) {
       System.out.println("        " + tekst);
       System.out.println("            Verwacht:  " + verwacht);
       System.out.println("            Werkelijk: " + werkelijk);
    }

    /** Maakt een <tt>GastTest</tt>-object en start dit. */
    public static void main(String[] args) {
        System.out.println("Log van " + GastTest.class + 
                           ", " + new java.util.Date());
        new GastTest().start();
    }
}
